#include <iostream>
using namespace std;

size_t nBytesCode(const char ch)
{
    // 如果最高位为0（0xxxxxxx），是ASCII字符，占1字节
    if (!(ch & (1 << 7)))
    {
        return 1;
    }

    // 最高位为1，进入多字节判断（1xxxxxxx）
    int nBytes = 1; // 记录字节数，初始为1（当前字节）
    // 从次高位开始判断连续的1的个数（UTF-8用前n位1标识字节数）
    for (int idx = 0; idx < 6; ++idx)
    { // UTF-8最多6字节（实际标准中最多4字节）
        // 检查从高位到低位的第(6 - idx)位是否为1
        if (ch & (1 << (6 - idx)))
        {
            nBytes++; // 每多一个连续的1，字节数+1
        }
        else
        {
            break; // 遇到0则停止计数
        }
    }

    // 根据UTF-8标准，有效字节数范围为1-4（这里限制合理范围，避免异常值）
    return (nBytes >= 1 && nBytes <= 4) ? nBytes : 1;
}

int editDistance(const std::string &lhs, const std::string &rhs)
{
    // 计算最小编辑距离-包括处理中英文
    size_t lhs_len = length(lhs);
    size_t rhs_len = length(rhs);
    int editDist[lhs_len + 1][rhs_len + 1];
    for (size_t idx = 0; idx <= lhs_len; ++idx)
    {
        editDist[idx][0] = idx;
    }
    for (size_t idx = 0; idx <= rhs_len; ++idx)
    {
        editDist[0][idx] = idx;
    }

    std::string sublhs, subrhs;
    for (std::size_t dist_i = 1, lhs_idx = 0; dist_i <= lhs_len; ++dist_i, ++lhs_idx)
    {
        size_t nBytes = nBytesCode(lhs[lhs_idx]);
        sublhs = lhs.substr(lhs_idx, nBytes);
        lhs_idx += (nBytes - 1);

        for (std::size_t dist_j = 1, rhs_idx = 0;
             dist_j <= rhs_len; ++dist_j, ++rhs_idx)
        {
            nBytes = nBytesCode(rhs[rhs_idx]);
            subrhs = rhs.substr(rhs_idx, nBytes);
            rhs_idx += (nBytes - 1);
            if (sublhs == subrhs)
            {
                editDist[dist_i][dist_j] = editDist[dist_i - 1][dist_j - 1];
            }
            else
            {
                editDist[dist_i][dist_j] =
                    triple_min(editDist[dist_i][dist_j - 1] + 1,
                               editDist[dist_i - 1][dist_j] + 1,
                               editDist[dist_i - 1][dist_j - 1] + 1);
            }
        }
    }
    return editDist[lhs_len][rhs_len];
}

int main()
{

    return 0;
}